H2 Database একটি রিলেশনাল ডেটাবেজ ম্যানেজমেন্ট সিস্টেম (RDBMS) যা ACID (Atomicity, Consistency, Isolation, Durability) প্রপার্টিজ সমর্থন করে, যার মাধ্যমে ট্রানজাকশন ম্যানেজমেন্ট অত্যন্ত নির্ভরযোগ্য এবং কার্যকরী হয়। ট্রানজাকশন ব্যবস্থাপনা নিশ্চিত করে যে ডেটাবেজের সমস্ত অপারেশন একে অপরের ওপর নির্ভরশীল না হয়ে স্বাধীনভাবে কাজ করতে পারে, তবে শেষে তাদের সব কিছু একত্রিত বা বাতিল হয়ে যেতে পারে।
একটি ট্রানজাকশন সম্পূর্ণরূপে সফল না হলে, তার সমস্ত অপারেশন রোলব্যাক করা হয়, অর্থাৎ, ডেটাবেজে কোনো পরিবর্তনই কার্যকর হয় না। একে "অপারেশনগুলির একক একক সত্ত্বা" বলা হয়।
উদাহরণ:
যদি দুটি স্টেপে একটি ট্রানজাকশন ঘটে (যেমন, ডেটা ইনসার্ট এবং তারপর ডেটা আপডেট), কিন্তু আপডেট স্টেপে কোনো ত্রুটি ঘটে, তবে ইনসার্ট অপারেশনটি বাতিল হয়ে যাবে।
একটি ট্রানজাকশন শুরু হওয়ার আগে এবং শেষ হওয়ার পরে ডেটাবেজের অবস্থা সঠিক থাকতে হবে। অর্থাৎ, ডেটাবেজে কোনো ত্রুটি বা অসঙ্গতি থাকা উচিত নয়।
উদাহরণ:
যদি কোনো ট্রানজাকশন পুরোপুরি সফল হয়, তবে এটি ডেটাবেজের অন্তর্নিহিত নিয়ম এবং কনস্ট্রেইন্টে কোনো সমস্যা সৃষ্টি না করে।
একটি ট্রানজাকশন চলাকালে অন্য ট্রানজাকশনগুলি তার কার্যক্রমের সাথে হস্তক্ষেপ করতে পারে না। প্রত্যেক ট্রানজাকশন পৃথকভাবে কাজ করবে, যেন কোনো আরেকটি ট্রানজাকশন চলতে না থাকলে সেই ট্রানজাকশনের প্রভাব আরেকটির ওপর না পড়ে।
উদাহরণ:
যদি দুটি ট্রানজাকশন একই রেকর্ডে পরিবর্তন করতে চেষ্টা করে, তবে ট্রানজাকশনগুলো একে অপরকে ব্লক করবে অথবা তাদের মধ্যে একটিকে প্রত্যাখ্যান করবে।
ট্রানজাকশন সফলভাবে শেষ হওয়ার পর, তার পরিবর্তনগুলি ডেটাবেজে স্থায়ীভাবে সংরক্ষিত হয়, এমনকি সিস্টেম ক্র্যাশ হলেও।
উদাহরণ:
আপনি একটি COMMIT
করতে পরে সিস্টেম ক্র্যাশ হলে, ট্রানজাকশন যে পরিবর্তন করেছে তা স্থায়ীভাবে সংরক্ষিত থাকবে।
H2 ডেটাবেজে ট্রানজাকশন পরিচালনা করার জন্য নিম্নলিখিত SQL কমান্ডগুলো ব্যবহার করা হয়:
এটি ট্রানজাকশন শুরু করার জন্য ব্যবহৃত হয়। H2 ডেটাবেজে ট্রানজাকশন স্বয়ংক্রিয়ভাবে শুরু হয় যখন আপনি কোনো INSERT
, UPDATE
, বা DELETE
অপারেশন চালান, তবে আপনি যদি ইচ্ছাকৃতভাবে ট্রানজাকশন শুরু করতে চান, তবে আপনি BEGIN TRANSACTION
ব্যবহার করতে পারেন।
BEGIN TRANSACTION;
যখন আপনি ট্রানজাকশনের সমস্ত কার্যক্রম সফলভাবে সম্পন্ন করেন, তখন COMMIT
ব্যবহার করে ডেটাবেজে সমস্ত পরিবর্তন সেভ করা হয়।
COMMIT;
যদি কোনো কারণে ট্রানজাকশনের কোনো অপারেশন সফল না হয় বা আপনি পরিবর্তন বাতিল করতে চান, তবে ROLLBACK
ব্যবহার করে পূর্ববর্তী অবস্থায় ফিরে যাওয়া হয়।
ROLLBACK;
আপনি যখন বড় ধরনের ট্রানজাকশন পরিচালনা করেন, তখন নির্দিষ্ট বিন্দুতে পরিবর্তন সংরক্ষণ করার জন্য SAVEPOINT
ব্যবহার করতে পারেন। এটি ট্রানজাকশনের একটি আংশিক অবস্থান সেভ করে, যাতে পরবর্তীতে যদি আপনি চান, তবে শুধুমাত্র সেই অংশটি রোলব্যাক করতে পারেন, পুরো ট্রানজাকশন নয়।
SAVEPOINT savepoint_name;
এবং এই সংরক্ষণ পয়েন্টে ফিরে যেতে:
ROLLBACK TO SAVEPOINT savepoint_name;
ট্রানজাকশন পৃথকীকরণের স্তর নিয়ন্ত্রণ করার জন্য SET TRANSACTION ISOLATION LEVEL
ব্যবহার করা হয়। H2 ডেটাবেজে চারটি পৃথকীকরণ স্তর রয়েছে:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
H2 ডেটাবেজ ডিফল্টভাবে auto-commit মোডে কাজ করে, যেখানে প্রতিটি SQL স্টেটমেন্টের পর স্বয়ংক্রিয়ভাবে COMMIT
করা হয়। আপনি যদি চান ট্রানজাকশন ম্যানুয়ালি পরিচালনা করতে, তবে auto-commit বন্ধ করতে পারেন:
SET AUTOCOMMIT FALSE;
ধরা যাক, একজন ব্যবহারকারীর অ্যাকাউন্ট থেকে আরেকটি অ্যাকাউন্টে টাকা ট্রান্সফার করতে চান। ট্রানজাকশন ব্যবহারের মাধ্যমে আমরা নিশ্চিত করতে পারি যে, যদি কোনো ত্রুটি ঘটে, তাহলে টাকা অপসারণ এবং জমা দুটি একই সময়ে হবে না।
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; -- টাকা কাটা
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- টাকা জমা
-- যদি কোনো ত্রুটি না ঘটে, তাহলে ট্রানজাকশন চূড়ান্ত করা হবে
COMMIT;
এখানে, যদি কোনো একটি UPDATE
অপারেশন ব্যর্থ হয়, তাহলে ROLLBACK
ব্যবহার করে সমস্ত পরিবর্তন বাতিল করা যাবে।
H2 ডেটাবেজে ট্রানজাকশন ম্যানেজমেন্ট অত্যন্ত শক্তিশালী এবং ACID প্রপার্টিজের মাধ্যমে এটি ডেটাবেজের অ্যাক্সেস এবং ব্যবস্থাপনাকে সুরক্ষিত রাখে। BEGIN TRANSACTION
, COMMIT
, ROLLBACK
এবং SAVEPOINT
ব্যবহার করে আপনি সহজেই ট্রানজাকশন পরিচালনা করতে পারবেন। H2-তে ট্রানজাকশন ম্যানেজমেন্ট নিশ্চিত করে যে ডেটাবেজের কোনো পরিবর্তন ত্রুটিপূর্ণ বা অসম্পূর্ণ না হয়।
ACID হলো একটি সেট যা Atomicity, Consistency, Isolation, এবং Durability এই চারটি বৈশিষ্ট্য নিয়ে গঠিত। এই গুণাবলীর মাধ্যমে ডেটাবেজ সিস্টেমের ট্রানজেকশনগুলি নিরাপদ, নির্ভরযোগ্য এবং কার্যকরী হয়। ডেটাবেজে যেকোনো রিড/রাইট অপারেশন বা ট্রানজেকশন সম্পাদন করার সময় ACID বৈশিষ্ট্যগুলো নিশ্চিত করা প্রয়োজন।
Atomicity এর মানে হলো একটি ট্রানজেকশন সম্পূর্ণভাবে সফল বা সম্পূর্ণভাবে ব্যর্থ হতে হবে, এর মাঝে কোনো অসম্পূর্ণ অবস্থার অস্তিত্ব থাকতে পারে না। এটি একটি "অথবা সবকিছু, অথবা কিছুই না" শর্ত। যদি ট্রানজেকশনটির মধ্যে কোনো ধাপ ব্যর্থ হয়, তাহলে সিস্টেমে কোনো পরিবর্তন করা হবে না এবং ডেটাবেজ আগের অবস্থায় ফিরে যাবে।
ধরা যাক, আপনি একটি ব্যাংক অ্যাকাউন্টে টাকা ট্রান্সফার করছেন:
যদি কোনো কারণে অ্যাকাউন্ট B তে টাকা যোগ করার অপারেশন ব্যর্থ হয়, তবে অ্যাকাউন্ট A থেকে টাকা কমানোর অপারেশনও বাতিল হয়ে যাবে, এবং ট্রানজেকশনটি শুরু হওয়ার আগের অবস্থায় ফিরে যাবে।
Consistency নিশ্চিত করে যে, ট্রানজেকশন সফলভাবে সম্পন্ন হলে ডেটাবেজ তার পূর্বের নির্ধারিত অবস্থার মধ্যে থাকবে। অর্থাৎ, ট্রানজেকশন শুরু হওয়ার আগে এবং পরে ডেটাবেজের অখণ্ডতা রক্ষা করা হয়। কোনো ট্রানজেকশন ডেটাবেজের অখণ্ডতাকে ক্ষতিগ্রস্ত করতে পারবে না।
ধরা যাক, একটি অ্যাকাউন্টে মাত্র ১০০০ টাকা থাকতে পারে (ম্যাক্সিমাম ব্যালেন্স)। যদি কেউ ১৫০০ টাকা ট্রান্সফার করার চেষ্টা করে, তাহলে Consistency বিধান অনুসারে, ট্রানজেকশনটি ব্যর্থ হবে এবং অ্যাকাউন্টে ১৫০০ টাকা না যোগ হয়ে ১০০০ টাকাই থাকবে।
Isolation নিশ্চিত করে যে, একাধিক ট্রানজেকশন একে অপরের থেকে বিচ্ছিন্নভাবে কাজ করে, অর্থাৎ এক ট্রানজেকশন অন্য ট্রানজেকশনগুলোর সাথে একে অপরকে প্রভাবিত করতে পারে না। একে অপরের কাজের মধ্যবর্তী কোনো পরিবর্তন দেখা যাবে না যতক্ষণ না একটি ট্রানজেকশন সম্পন্ন হয়।
ধরা যাক, একটি ট্রানজেকশন অ্যাকাউন্ট A থেকে টাকা সরাচ্ছে, এবং অন্য একটি ট্রানজেকশন অ্যাকাউন্ট B তে টাকা যোগ করছে। Isolation নিশ্চিত করবে যে, দুটি ট্রানজেকশন একই সময়ে একে অপরের মধ্যে কোনরকম অসঙ্গতি সৃষ্টি করতে পারবে না।
Durability নিশ্চিত করে যে, একটি ট্রানজেকশন সফলভাবে সম্পন্ন হওয়ার পর, তার সমস্ত পরিবর্তন স্থায়ী হবে এবং কোনো কারণে সিস্টেম বন্ধ হয়ে গেলেও সেই পরিবর্তনগুলি হারানো যাবে না। অর্থাৎ, ট্রানজেকশন সম্পন্ন হলে তার পরিবর্তন ডেটাবেজে স্থায়ীভাবে সংরক্ষিত থাকবে।
যদি একটি ব্যাংক ট্রানজেকশন সম্পন্ন হওয়ার পর পাওয়া অর্থ অ্যাকাউন্টে জমা হয়ে যায় এবং এর পর সিস্টেমে বিদ্যুৎ বিপর্যয় ঘটে, তবে Durability গুণাবলী নিশ্চিত করবে যে, সেই টাকা হারিয়ে যাবে না এবং পরবর্তী সময়ে তা অ্যাকাউন্টে উপলব্ধ থাকবে।
এটি ছিল ACID Properties এর বিস্তারিত আলোচনা, যা ডেটাবেজ সিস্টেমের মৌলিক গুণাবলী এবং ট্রানজেকশন ম্যানেজমেন্টের গুরুত্বপূর্ণ অংশ। ACID এর মাধ্যমে নিশ্চিত করা হয় যে, ডেটাবেজ সিস্টেমের ট্রানজেকশনগুলো সঠিক, নির্ভরযোগ্য এবং নিরাপদ।
H2 Database-এ Commit এবং Rollback দুটি গুরুত্বপূর্ণ ট্রানজেকশন ম্যানেজমেন্ট অপারেশন। এগুলি ডেটাবেজের ডেটা পরিবর্তনের প্রক্রিয়া নিয়ন্ত্রণ করে এবং ডেটাবেজে সঠিকতা এবং অখণ্ডতা (consistency) বজায় রাখে। নিচে এই দুটি অপারেশন এবং তাদের ব্যবহার বিস্তারিতভাবে আলোচনা করা হলো।
Commit হল একটি SQL ট্রানজেকশন অপারেশন যা ডেটাবেজে করা পরিবর্তনগুলি স্থায়ী (persistent) করে তোলে। যখন একটি ট্রানজেকশনের মধ্যে একাধিক অপারেশন (যেমন INSERT
, UPDATE
, DELETE
) করা হয়, তখন Commit এই পরিবর্তনগুলিকে ডেটাবেজে সেভ করে দেয়।
Commit
করেন, তখন ট্রানজেকশনের মধ্যে করা সমস্ত পরিবর্তন চূড়ান্ত হয়ে যায় এবং সেগুলি স্থায়ীভাবে ডেটাবেজে সংরক্ষিত হয়।Commit
করার পরে, ট্রানজেকশন শেষ হয়ে যায় এবং কোনও পরিবর্তন আর বাতিল (rollback) করা সম্ভব নয়।BEGIN;
INSERT INTO employees (id, name, position, salary) VALUES (1, 'Alice', 'Engineer', 50000);
UPDATE employees SET salary = 60000 WHERE id = 1;
COMMIT;
এখানে:
BEGIN
দ্বারা ট্রানজেকশন শুরু হয়েছে।INSERT
এবং UPDATE
অপারেশন)।COMMIT
অপারেশন দ্বারা এই পরিবর্তনগুলি ডেটাবেজে স্থায়ী হয়ে গেছে।Rollback হল একটি SQL ট্রানজেকশন অপারেশন যা ট্রানজেকশনের মধ্যে করা সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনে। যদি আপনি একটি ট্রানজেকশন চলাকালে কোনও ভুল বা সমস্যা দেখতে পান, তবে Rollback
ব্যবহার করে আপনি সমস্ত পরিবর্তন বাতিল করতে পারেন এবং ডেটাবেজকে পূর্বের অবস্থায় ফিরিয়ে আনতে পারেন।
Rollback
করা হয়, তখন ট্রানজেকশনের মধ্যে করা সমস্ত পরিবর্তন ফিরিয়ে আনা হয় এবং ডেটাবেজ পূর্বের অবস্থায় ফিরে আসে।BEGIN;
INSERT INTO employees (id, name, position, salary) VALUES (2, 'Bob', 'Manager', 70000);
UPDATE employees SET salary = 65000 WHERE id = 2;
-- যদি কিছু ভুল হয়, Rollback করা হবে
ROLLBACK;
এখানে:
BEGIN
দ্বারা ট্রানজেকশন শুরু হয়েছে।INSERT
এবং UPDATE
অপারেশন)।ROLLBACK
দ্বারা করা সমস্ত পরিবর্তন বাতিল হয়ে যাবে এবং ডেটাবেজ পূর্বের অবস্থায় ফিরে যাবে।Rollback
করে ডেটাবেজের পূর্বের অবস্থায় ফিরে যেতে পারেন, ফলে ডেটা সুরক্ষিত থাকে।বৈশিষ্ট্য | Commit | Rollback |
---|---|---|
ফাংশন | পরিবর্তনগুলিকে ডেটাবেজে স্থায়ী করে তোলে | করা পরিবর্তনগুলো বাতিল করে পূর্বের অবস্থায় ফিরে আসে |
ব্যবহার | যখন আপনি নিশ্চিত হন যে সব কিছু সঠিকভাবে সম্পন্ন হয়েছে | যখন একটি ভুল বা সমস্যা ঘটে এবং পরিবর্তনগুলো বাতিল করতে হয় |
পরিণতি | পরিবর্তন স্থায়ী হয় এবং আর বাতিল করা যায় না | পরিবর্তনগুলি বাতিল হয়ে যায়, এবং ডেটাবেজ পূর্বের অবস্থায় ফিরে আসে |
কখন ব্যবহার করবেন | ডেটাবেজে করা পরিবর্তনগুলো নিশ্চিতভাবে সেভ করতে | ভুল সংশোধন করতে বা পরীক্ষার সময়ে ডেটাবেজে কোনো পরিবর্তন করতে না চাওয়া |
H2 ডেটাবেজে ট্রানজেকশনের Isolation Levels ব্যবহার করা যায়, যা ট্রানজেকশনের কার্যকলাপের মধ্যে বিভিন্ন রকমের concurrency control পরিচালনা করে। নিম্নলিখিত Isolation Levels সমর্থিত:
H2 ডেটাবেজে ট্রানজেকশন ম্যানেজমেন্টের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে আপনার ডেটাবেজের ডেটা সঠিক, স্থায়ী এবং সুরক্ষিত থাকে। Commit
এবং Rollback
হল ডেটাবেজে সর্বোচ্চ অখণ্ডতা এবং নিয়ন্ত্রণ বজায় রাখার জন্য অপরিহার্য টুল।
ট্রানজেকশন আইসোলেশন লেভেল (Transaction Isolation Levels) হল একটি ডেটাবেজের ট্রানজেকশন সিস্টেমের এমন একটি বৈশিষ্ট্য, যা নির্ধারণ করে একাধিক ট্রানজেকশন একসাথে চালানোর সময়, কীভাবে তাদের মধ্যে ডেটার একে অপরের উপর প্রভাব ফেলবে। এটি মূলত ডেটার সঠিকতা এবং ধারাবাহিকতা নিশ্চিত করতে ব্যবহৃত হয়, বিশেষ করে একাধিক ট্রানজেকশন একই সময়ে সম্পাদিত হলে।
ডেটাবেজ সিস্টেমে সাধারণত ৪টি প্রধান ট্রানজেকশন আইসোলেশন লেভেল রয়েছে:
এটি সবচেয়ে নিম্ন স্তরের আইসোলেশন লেভেল। এই লেভেলে একটি ট্রানজেকশন অন্য ট্রানজেকশনের অকমিটেড (committed না হওয়া) ডেটা পড়তে পারে, যা "ডার্টি রিড" (dirty read) হিসেবে পরিচিত। এর মানে, একটি ট্রানজেকশন অন্য ট্রানজেকশন দ্বারা পরিবর্তিত হওয়া ডেটা অ্যাক্সেস করতে পারে, যদিও সেই পরিবর্তন শেষ হয়নি বা কমিট হয়নি।
এই আইসোলেশন লেভেলে একটি ট্রানজেকশন শুধুমাত্র অন্য ট্রানজেকশনের কমিটেড (committed) ডেটা পড়তে পারে। অর্থাৎ, একটি ট্রানজেকশন সম্পূর্ণভাবে শেষ না হওয়া পর্যন্ত অন্য ট্রানজেকশন তার পরিবর্তিত ডেটা পড়তে পারে না। এটি "ফ্যান্টম রিড" (phantom read) এবং "ডার্টি রিড" (dirty read) থেকে রক্ষা করে।
এই আইসোলেশন লেভেলে একটি ট্রানজেকশন যখন কোনো ডেটা পড়ে, তখন সে ডেটার মান শেষ ট্রানজেকশনের মধ্যে স্থির থাকবে। এতে "ফ্যান্টম রিড" সমস্যা কমে যায়, কিন্তু কিছু ক্ষেত্রে "ফ্যান্টম রেকর্ড" (phantom record) তৈরি হতে পারে।
এটি সবচেয়ে শক্তিশালী এবং সর্বোচ্চ আইসোলেশন লেভেল। এই লেভেলে, সমস্ত ট্রানজেকশন সম্পূর্ণভাবে একে অপরের থেকে আলাদা এবং একে অপরের উপর কোনো প্রভাব ফেলতে পারে না। অর্থাৎ, একে অপরের সঙ্গে serially (একটির পর একটি) সম্পাদিত হবে। এতে কোনো ধরনের "ডার্টি রিড", "নন-রিপিটেবল রিড", বা "ফ্যান্টম রিড" সমস্যা থাকে না।
প্রতিটি আইসোলেশন লেভেলের সুবিধা এবং অসুবিধা আছে। আপনার প্রয়োজনে কোন আইসোলেশন লেভেল ব্যবহার করবেন তা নির্ভর করবে আপনার অ্যাপ্লিকেশন এবং ডেটাবেজের কাজের ধরন ও পারফরম্যান্সের প্রয়োজনের উপর।
common.read_more